package org.example.shop_front_api.utils;

import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtUtils {
    // 密钥（实际项目中建议从配置文件读取，且长度足够长）
    private static final String SECRET_KEY = "thisIsASecretKeyWithEnoughLengthForHmacSha256Algorithm!";
    // 过期时间：2小时（单位：毫秒）
    private static final long EXPIRATION_TIME = 2 * 60 * 60 * 1000;

    // 生成 JWT
    public static String generateToken(String username) {
        // 1. 创建过期时间
        Date expirationDate = new Date(System.currentTimeMillis() + EXPIRATION_TIME);

        // 2. 构建 JWT
        return Jwts.builder()
                // 自定义 payload 信息（例如用户ID、角色等）
                .setClaims(buildClaims(username))
                // 签发时间
                .setIssuedAt(new Date())
                // 过期时间
                .setExpiration(expirationDate)
                // 签名算法和密钥
                .signWith(getSigningKey(), SignatureAlgorithm.HS256)
                .compact();
    }

    // 验证 JWT 并返回用户名
    public static String validateTokenAndGetUsername(String token) {
        try {
            // 解析 JWT
            Claims claims = Jwts.parserBuilder()
                    .setSigningKey(getSigningKey()) // 设置签名密钥
                    .build()
                    .parseClaimsJws(token) // 验证并解析
                    .getBody();

            // 从 payload 中获取用户名
            return claims.get("username", String.class);
        } catch (JwtException | IllegalArgumentException e) {
            // 验证失败（过期、签名错误等）
            throw new RuntimeException("无效的token: " + e.getMessage());
        }
    }

    // 构建自定义 payload
    private static Map<String, Object> buildClaims(String username) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("username", username); // 存储用户名
        // 可添加其他信息，如角色：claims.put("role", "user");
        return claims;
    }

    // 获取签名密钥（HS256 算法需要 256 位密钥）
    private static Key getSigningKey() {
        byte[] keyBytes = SECRET_KEY.getBytes(StandardCharsets.UTF_8);
        return Keys.hmacShaKeyFor(keyBytes);
    }
}
